#include <iostream>
#include <sys/select.h>
#include <unistd.h>
#include <cstring>
#include <cerrno>

void TestSelect()
{
    // 创建文件描述符集合 并将将标准输入文件描述符添加到集合中
    fd_set read_fds;
    FD_ZERO(&read_fds);
    FD_SET(0, &read_fds);

    // 设置超时时间为5秒
    struct timeval timeout;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0; // 设置微妙

   
    while (true)
    {
        // 调用select函数等待标准输入就绪
        int ret = select(0 + 1, &read_fds, nullptr, nullptr, &timeout);
        if (ret < 0) // select 函数调用失败，输出错误信息
        {
            std::cerr << "select error: " << strerror(errno) << std::endl;
        }
        else if (ret == 0) // 超时，没有文件描述符就绪
        {
            std::cout << "Timeout" << std::endl;
            sleep(1);
        }
        else
        {
            // 检查标准输入是否就绪
            if (FD_ISSET(0, &read_fds))
            {
                // 从标准输入中读取
                char buffer[1024];
                ssize_t read_size = read(0, buffer, sizeof(buffer));
                if (read_size < 0)
                {
                    // read 函数调用失败，输出错误信息
                    std::cerr << "read error: " << strerror(errno) << std::endl;
                }
                else if (read_size == 0)
                {
                    // 读到文件结尾，输出提示信息
                    std::cout << "End of file" << std::endl;
                }
                else
                {
                    // 成功读取数据，输出读取的内容
                    buffer[read_size] = '\0';
                    std::cout << "Read from stdin: " << buffer << std::endl;
                }
            }
        }
    }
}

#include "Select.hpp"
#include <algorithm>
#include <memory>
int main()
{
    std::shared_ptr<Select> select(new Select());
    select->Start();
}